package common

import "ws-demo-go/pkg/ws/common"

// AddToSendChanWithoutBlocking 将指定帧放入发送缓冲队列，非阻塞
func AddToSendChanWithoutBlocking(sendChan SendChan, frame *IncompleteFrame) error {
	select {
	case sendChan <- frame:
		return nil
	default:
		return common.ErrSendBufferFull // 如果队列已满，则会直接抛出异常
	}
}

// SendBytes 发送数据
func SendBytes(sendChan SendChan, data []byte) error {
	frame := &IncompleteFrame{} // TODO 这里可以用对象池技术管理 Frame，不用每次都创建一个 frame 发送
	setIncompleteBinaryFrame(frame, data)
	return AddToSendChanWithoutBlocking(sendChan, frame)
}

// 设置一个不完整的二进制帧，用于写入传输层的发送缓冲队列
func setIncompleteBinaryFrame(frame *IncompleteFrame, payload []byte) {
	frame.Opcode = common.OpBinary
	frame.Payload = payload
}
